package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;  

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.faces.bean.*;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import controller.AmministrazioneInterface;
import controller.PersonaleInterface;
import controller.RicercaInterface;
import controller.UserMgr;
import dto.*;

@ManagedBean(name="ricerca")
@ViewScoped
public class CercaElementi implements Serializable {  
	private static final long serialVersionUID = 1L;
	@EJB
	private UserMgr userMgr;
	@EJB
	private PersonaleInterface personal;
	@EJB
	private RicercaInterface ricerca;
	@EJB
	private AmministrazioneInterface admin;
	
	
    static List<ElementoBaseDTO> elementi;  
    static List<PacchettoPredefinitoDTO> pacchettiPred;
    
    private List<ElementoBaseDTO> filteredElementi;  
    private List<PacchettoPredefinitoDTO> filteredPacchettoPred;
    
    private  ElementoBaseDTO selectedElemento;
    private  PacchettoPersonaleDTO selectedPacchetto;
    private  PacchettoPredefinitoDTO selectedPredPacchetto;

    private  VoloDTO volo;
    private  HotelDTO hotel;
    private  EscursioneDTO escursione;

	@Resource(lookup = "EMailME")
	private Session mailSession;//

    public void loadData(){
    	CercaElementi.elementi = ricerca.getElementiBase();
    }
    
    public void loadDataPred(){
    	CercaElementi.pacchettiPred = ricerca.getPacchettiPredefiniti();
    }

	public List<ElementoBaseDTO> getFilteredElementi() {
		return filteredElementi;
	} 

	public void setFilteredElementi(List<ElementoBaseDTO> filteredElementi) {
		this.filteredElementi = filteredElementi;
	}

	public List<ElementoBaseDTO> getElementi() {
		return CercaElementi.elementi;
	}

	public ElementoBaseDTO getSelectedElemento() {
		return selectedElemento;
	}

	public void setSelectedElemento(ElementoBaseDTO selectedElemento) {
		this.selectedElemento = selectedElemento;
	}

	public PacchettoPersonaleDTO getSelectedPacchetto() {
		return selectedPacchetto;
	}

	public void setSelectedPacchetto(PacchettoPersonaleDTO selectedPacchetto) {
		this.selectedPacchetto = selectedPacchetto;
	}
	

	public PacchettoPredefinitoDTO getSelectedPredPacchetto() {
		return selectedPredPacchetto;
	}

	public void setSelectedPredPacchetto(
		PacchettoPredefinitoDTO selectedPredPacchetto) {
		this.selectedPredPacchetto = selectedPredPacchetto;
	}
	
	public void onEdit(){
		System.out.println("Editing");
		Thread t = new Thread(new Runnable() {
	         public void run()
	         {
	        	ArrayList<String> sending = new ArrayList<String>();
	        	if(volo!=null){
	        		ArrayList<String> email = admin.modificaVolo(volo);
	        		for(String e : email){
	        			boolean ins = true;
	        			for(String s: sending){
	        				if(s==e) ins=false;
	        			}
	        			if(ins) sending.add(e);
	        		}
	        	}
	        	if(hotel!=null){
	        	ArrayList<String> email = admin.modificaHotel(hotel);
        		for(String e : email){
        			boolean ins = true;
        			for(String s: sending){
        				if(s==e) ins=false;
        			}
        			if(ins) sending.add(e);
        		}
	        	}
	        	if(escursione!=null){
	        	ArrayList<String> email = admin.modificaEscursione(escursione);
        		for(String e : email){
        			boolean ins = true;
        			for(String s: sending){
        				if(s==e) ins=false;
        			}
        			if(ins) sending.add(e);
        		}
	        	}

        		ArrayList<String> email = admin.modificaElementoBase(selectedElemento);
        		for(String e : email){
        			boolean ins = true;
        			for(String s: sending){
        				if(s==e) ins=false;
        			}
        			if(ins) sending.add(e);
        		}
	    		System.out.println("Invio email...");

	    		for(String e : sending){
	    			System.out.println("invio a:"+e);
	    			sendEmail(e, "Modifica", "La informiamo che l'elemento "+selectedElemento.getNome()+" è stato modificato");
	    		}
	         }
	});
		t.start();

	}

	
	public void sendEmail(String to, String subject, String body) {
		
		MimeMessage message = new MimeMessage(mailSession);
		try {
		message.setFrom(new InternetAddress(mailSession.getProperty("mail.from")));
		InternetAddress[] address = {new InternetAddress(to)};
		message.setRecipients(MimeMessage.RecipientType.TO, address);
		message.setSubject(subject);
		message.setSentDate(new Date());
		message.setText(body);
		Transport.send(message);
		} catch (MessagingException ex) {
		ex.printStackTrace();
		}
		}
	
	public String dettaglio(){
		if(this.selectedElemento.getTipo().equals("Volo"))
			return "dettaglioVolo.xhtml?faces-redirect=true&amp;id="+this.selectedElemento.getIdElementoBase();
		else if(this.selectedElemento.getTipo().equals("Hotel"))
			return "dettaglioHotel.xhtml?faces-redirect=true&amp;id="+this.selectedElemento.getIdElementoBase();
		else if(this.selectedElemento.getTipo().equals("Escursione"))
				return "dettaglioEscursione.xhtml?faces-redirect=true&amp;id="+this.selectedElemento.getIdElementoBase();
		else return "index.xhtml?faces-redirect=true";
	}

	public String dettaglio(ElementoBaseDTO selectedElemento){
		if(selectedElemento.getTipo().equals("Volo"))
			return "dettaglioVolo.xhtml?faces-redirect=true&amp;id="+selectedElemento.getIdElementoBase();
		else if(selectedElemento.getTipo().equals("Hotel"))
			return "dettaglioHotel.xhtml?faces-redirect=true&amp;id="+selectedElemento.getIdElementoBase();
		else if(selectedElemento.getTipo().equals("Escursione"))
				return "dettaglioEscursione.xhtml?faces-redirect=true&amp;id="+selectedElemento.getIdElementoBase();
		else return "index.xhtml?faces-redirect=true";
	}
	
	public List<PacchettoPredefinitoDTO> getFilteredPacchettoPred() {
		return filteredPacchettoPred;
	}

	public void setFilteredPacchettoPred(
			List<PacchettoPredefinitoDTO> filteredPacchettoPred) {
		this.filteredPacchettoPred = filteredPacchettoPred;
	}

	public static List<PacchettoPredefinitoDTO> getPacchettiPred() {
		return pacchettiPred;
	}

	public static void setPacchettiPred(List<PacchettoPredefinitoDTO> pacchettiPred) {
		CercaElementi.pacchettiPred = pacchettiPred;
	}
	
	/*
	public void aggiungiElemento(){
		if(selectedElemento!=null){
		List<ElementoBaseDTO> newList = this.selectedPredPacchetto.getElementi();
		newList.add(selectedElemento);
		this.selectedPredPacchetto.setElementi(newList);
		this.selectedPredPacchetto.setTotale(this.selectedPredPacchetto.getTotale()+selectedElemento.getPrezzo());
		admin.modificaPacchetto(selectedPredPacchetto);
		}
	}
	*/
	public void loadDettaglio(ElementoBaseDTO selectedElemento){
		if(selectedElemento==null) System.out.println("Elemento Vuoto");
		if(selectedElemento!=null){
			if(selectedElemento.getTipo().equals("Volo")){
				this.volo = ricerca.getDettaglioVolo(selectedElemento);
			}
			if(selectedElemento.getTipo().equals("Escursione")){
				this.escursione = ricerca.getDettaglioEscursione(selectedElemento);
			}
			if(selectedElemento.getTipo().equals("Hotel")){
				this.hotel = ricerca.getDettaglioHotel(selectedElemento);
			}
		}
	}
	
	public void loadDettaglioAmm(String id){
		if(id!=null){
			try{
		int pk = Integer.parseInt(id);
		this.selectedElemento =	ricerca.getElementoPK(pk);
		if(selectedElemento!=null){
			if(selectedElemento.getTipo().equals("Volo")){
				this.volo = ricerca.getDettaglioVolo(selectedElemento);
				this.escursione = null;
				this.hotel = null;
			}
			if(selectedElemento.getTipo().equals("Escursione")){
				this.volo = null;
				this.escursione = ricerca.getDettaglioEscursione(selectedElemento);
				this.hotel = null;
			}
			if(selectedElemento.getTipo().equals("Hotel")){
				this.volo = null;
				this.hotel = ricerca.getDettaglioHotel(selectedElemento);
				this.escursione = null;
			}
		}
		}catch(Exception e){}
		}
	}

	public HotelDTO getHotel() {
		return hotel;
	}

	public void setHotel(HotelDTO hotel) {
		this.hotel = hotel;
	}

	public EscursioneDTO getEscursione() {
		return escursione;
	}

	public void setEscursione(EscursioneDTO escursione) {
		this.escursione = escursione;
	}
	
	public VoloDTO getVolo(){
		return volo;
	}
	
	public void setVolo(VoloDTO volo){
		this.volo=volo;
	}
}  